home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 January / macformat-020.iso / Shareware City / Developers / mega src / Source / mkdir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-17  |  6.0 KB  |  265 lines  |  [TEXT/KAHL]

  1. /* ========== the commmand file: ==========
  2.  
  3.     mkdir.c
  4.     
  5.     Copyright (c) 1993,1994 Newport Software Development
  6.     
  7.     You may distribute unmodified copies of this file for
  8.     noncommercial purposes.  You may use this file as a
  9.     reference when writing your own nShell(tm) commands.
  10.     
  11.     All other rights are reserved.
  12.     
  13.    ========== the commmand file: ========== */
  14.  
  15. #include <script.h>
  16. #include <string.h>
  17.  
  18. #include "nshc.h"
  19.  
  20. #include "arg_utl.proto.h"
  21. #include "fss_utl.proto.h"
  22. #include "nshc_utl.proto.h"
  23. #include "str_utl.proto.h"
  24.  
  25. // data definition - this struct is the root of all data
  26.  
  27. typedef struct {
  28.  
  29.     int        got_fss;        // 0 if FSSpec calls are not available
  30.     int        arg;            // position in arg list
  31.  
  32. } t_mkdir_data;
  33.  
  34. typedef    t_mkdir_data    **mkdir_hndl;
  35.  
  36. /* ======================================== */
  37.  
  38. // prototypes - utility
  39.  
  40. void mkdir_bad( t_nshc_parms *nshc_parms, int code );
  41. void mkdir_bad_file( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls, StringPtr msg );
  42. void mkdir_good( t_nshc_parms *nshc_parms );
  43.  
  44. // prototypes - file routines
  45.  
  46. OSErr mkdir(int got_fss, const FSSpec *spec);
  47. OSErr mkdir_info(const FSSpec *spec, int *isDir);
  48. void  mkdir_one( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls, t_mkdir_data **hData );
  49.  
  50. // prototypes - state machine
  51.  
  52. void mkdir_start( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls  );
  53. void mkdir_continue( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls );
  54. void mkdir_stop( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls );
  55.  
  56. /* ======================================== */
  57.  
  58. // utility routines
  59.  
  60. /* ======================================== */
  61.  
  62. void mkdir_bad(  t_nshc_parms *nshc_parms, int code )
  63. {
  64.     nshc_parms->action = nsh_stop;
  65.     nshc_parms->result = code;
  66. }
  67.  
  68. void mkdir_bad_file(  t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls, StringPtr msg )
  69. {
  70.  
  71.     nshc_calls->NSH_putStr_err("\pmkdir: Directory access error (");
  72.     nshc_calls->NSH_putStr_err(msg);
  73.     nshc_calls->NSH_putStr_err("\p)\r");
  74.  
  75.     nshc_parms->action = nsh_stop;
  76.     nshc_parms->result = NSHC_ERR_GENERAL;
  77. }
  78.  
  79. void mkdir_good(  t_nshc_parms *nshc_parms )
  80. {
  81.     nshc_parms->action = nsh_stop;
  82.     nshc_parms->result = 0;
  83. }
  84.  
  85. /* ======================================== */
  86.  
  87. // file access routines
  88.  
  89. /* ========================================== */
  90.  
  91. OSErr mkdir_info(const FSSpec *spec, int *isDir)
  92. {
  93.     CInfoPBRec pb;
  94.     OSErr error;
  95.  
  96.     pb.hFileInfo.ioNamePtr = (StringPtr)spec->name;
  97.     pb.hFileInfo.ioVRefNum = spec->vRefNum;
  98.     pb.hFileInfo.ioDirID = spec->parID;
  99.     pb.hFileInfo.ioFDirIndex = 0;
  100.     
  101.     error = PBGetCatInfoSync(&pb);
  102.     
  103.     *isDir = (pb.hFileInfo.ioFlAttrib & 0x10) != 0;
  104.         
  105.     return (error);
  106. }
  107.  
  108. /* ========================================== */
  109.  
  110. OSErr mkdir(int got_fss, const FSSpec *spec)
  111. {
  112.     OSErr            result;
  113.     long            dirID;
  114.     HParamBlockRec    pb;
  115.  
  116.     if (got_fss)
  117.         return (FSpDirCreate(spec, smSystemScript, &dirID));
  118.     else {
  119.         pb.fileParam.ioVRefNum = spec->vRefNum;
  120.         pb.fileParam.ioDirID = spec->parID;
  121.         pb.fileParam.ioNamePtr = (StringPtr) &(spec->name);
  122.         
  123.         result = PBDirCreateSync(&pb);
  124.         
  125.         return (result);
  126.         }
  127. }
  128. /* ======================================== */
  129.  
  130. void mkdir_one( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls, t_mkdir_data **hData )
  131. {
  132.     int        result;
  133.     FSSpec    fsspec;
  134.     long    dirID;
  135.     int        isDir;
  136.     int        isEmpty;
  137.     
  138.     // =====> convert argument to fsspec
  139.     
  140.     result = arg_to_fss( nshc_parms, nshc_calls, (**hData).arg, &fsspec );
  141.  
  142.     (**hData).arg++;
  143.     
  144.     if (result) {
  145.         mkdir_bad( nshc_parms, result );
  146.         return;
  147.         }
  148.     
  149.     result = mkdir_info( &fsspec, &isDir );
  150.                 
  151.     if (!result) {
  152.     
  153.         if ( isDir )
  154.             nshc_calls->NSH_putStr_err("\pmkdir: Directory already exists = ");
  155.         else
  156.             nshc_calls->NSH_putStr_err("\pmkdir: File already exists = ");
  157.             
  158.         nshc_calls->NSH_putStr_err((StringPtr)fsspec.name);
  159.         nshc_calls->NSH_putchar('\r');
  160.         return;
  161.         
  162.         }
  163.     
  164.     if ( result != fnfErr ) {
  165.         mkdir_bad_file( nshc_parms, nshc_calls, (StringPtr)fsspec.name );
  166.         return;
  167.         }
  168.             
  169.     // =====> make the new directory
  170.         
  171.     result = mkdir((**hData).got_fss, &fsspec);
  172.     
  173.     if ( result ) {
  174.         mkdir_bad_file( nshc_parms, nshc_calls, (StringPtr)fsspec.name );
  175.         return;
  176.         }
  177.  
  178.     result = fss_wake_parent( &fsspec );
  179.  
  180.     if (result)
  181.         nshc_calls->NSH_putStr_err( "\pmv: Warning - could update finder info.\r" );
  182. }
  183.  
  184. /* ======================================== */
  185.  
  186. // state machine - core routines
  187.  
  188. /* ======================================== */
  189.  
  190. void mkdir_start( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls  )
  191. {
  192.     mkdir_hndl    hData;    // handle to hold our data
  193.     
  194.     if (nshc_parms->argc < 2) {
  195.         nshc_calls->NSH_putStr_err( "\pUsage: mkdir dir [dir...]\r" );
  196.         mkdir_bad( nshc_parms, NSHC_ERR_PARMS );
  197.         return;
  198.         }
  199.         
  200.     nshc_parms->action = nsh_continue;
  201.  
  202.     hData = (mkdir_hndl)NewHandleClear(sizeof(t_mkdir_data));
  203.     
  204.     if (hData) {
  205.         (**hData).arg = 1;                    // start at the arg = 1 position
  206.         (**hData).got_fss = fss_test();        // test if we can use FSSpec calls
  207.         nshc_parms->data = (Handle)hData;
  208.         }
  209.     else {
  210.         nshc_calls->NSH_putStr_err( "\pmkdir: Could not allocate storage.\r" );
  211.         mkdir_bad( nshc_parms, NSHC_ERR_MEMORY );
  212.         }
  213. }
  214.  
  215. /* ======================================== */
  216.  
  217. void mkdir_continue( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls )
  218. {
  219.     int        i;
  220.     mkdir_hndl    hData;
  221.     
  222.     if (hData = (mkdir_hndl)nshc_parms->data) {
  223.  
  224.         if ((**hData).arg >= nshc_parms->argc)
  225.             mkdir_good( nshc_parms );
  226.         else
  227.             mkdir_one( nshc_parms, nshc_calls, hData );
  228.  
  229.         }
  230. }
  231.  
  232. /* ======================================== */
  233.  
  234. void mkdir_stop( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls )
  235. {
  236.     mkdir_hndl    hData;
  237.     
  238.     if (hData = (mkdir_hndl)nshc_parms->data)
  239.         DisposeHandle(nshc_parms->data);
  240.         
  241.     nshc_parms->action = nsh_idle;
  242. }
  243.  
  244. /* ======================================== */
  245.  
  246. void main(t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls)
  247. {
  248.     
  249.     if (nshc_bad_version( nshc_parms, nshc_calls, NSHC_VERSION )) return;
  250.     
  251.     switch (nshc_parms->action) {
  252.         case nsh_start:
  253.             mkdir_start(nshc_parms, nshc_calls);
  254.             break;
  255.         case nsh_continue:
  256.             mkdir_continue(nshc_parms, nshc_calls);
  257.             break;
  258.         case nsh_stop:
  259.             mkdir_stop(nshc_parms, nshc_calls);
  260.             break;
  261.         }
  262. }
  263.  
  264. /* ======================================== */
  265.